ci: resolve PR merge conflicts with Pi#7556
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds GitHub Actions automation and supporting tools to discover same-repository conflicts, resolve them with a sandboxed Pi task, validate binary patches, and publish verified merge commits. Tests cover Git behavior, publication safeguards, workflow boundaries, and sandbox policy. ChangesPR conflict resolution automation
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant GitHubActions
participant discoverConflicts
participant OpenShellPi
participant publishResolution
participant GitHubAPI
GitHubActions->>discoverConflicts: scan open conflicts
discoverConflicts-->>GitHubActions: conflict matrix
GitHubActions->>OpenShellPi: run sandboxed resolution
OpenShellPi-->>GitHubActions: upload resolution patch
GitHubActions->>publishResolution: download patch artifact
publishResolution->>GitHubAPI: validate state and create merge commit
GitHubAPI-->>publishResolution: update head ref
Suggested labels: 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in commit c2117da in the TypeScript / code-coverage/cliThe overall coverage in commit c2117da in the Show a code coverage summary of the most impacted files.
Updated |
PR Review Advisor — No blocking findings reportedAdvisor assessment: No blocking advisor findings reported Model lanes
Nemotron output stays in workflow artifacts and does not change the assessment above. E2E guidanceAdvisory only. E2E / PR Gate selects and runs jobs independently. Recommended E2E: None 2 optional E2E recommendations
1 warning · 0 suggestionsWarningsWarnings do not block.
|
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (8)
tools/pr-merge-conflict-fixer/publish.mts (1)
359-361: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winReading the whole patch just to check existence.
The buffer is discarded. Use
statSyncand, since the patch is sandbox-produced untrusted output, reject implausibly large files up front.♻️ Proposed change
- readFileSync(patchPath); + const patchStats = statSync(patchPath); + if (patchStats.size > 8 * 1024 * 1024) { + throw new ConflictFixerError("The resolution patch is unexpectedly large"); + }Update the import:
import { mkdtempSync, rmSync, statSync } from "node:fs";🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tools/pr-merge-conflict-fixer/publish.mts` around lines 359 - 361, Replace the discarded readFileSync call near artifactDirectory and patchPath with statSync to check the patch exists without loading its contents. Validate the resulting file size and reject implausibly large sandbox-produced patches before continuing, and update the node:fs import accordingly.test/pr-merge-conflict-fixer.test.ts (2)
35-58: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winIsolate the fixture from ambient Git config for determinism.
merge.conflictStyle,core.autocrlf, hook paths, or init templates from a contributor's global config can change conflict output and flake these assertions.♻️ Pin global/system config off
function git(repository: string, args: string[]): string { return execFileSync("git", args, { cwd: repository, encoding: "utf8", + env: { ...process.env, GIT_CONFIG_GLOBAL: "/dev/null", GIT_CONFIG_SYSTEM: "/dev/null" }, stdio: ["ignore", "pipe", "pipe"], }).trim(); }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/pr-merge-conflict-fixer.test.ts` around lines 35 - 58, Update createConflictFixture and its git helper setup to isolate the temporary repository from ambient global and system Git configuration, disabling inherited settings such as merge.conflictStyle, core.autocrlf, hooks, and init templates while preserving the existing repository-specific configuration and fixture behavior.
189-202: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd coverage for malformed patches and unresolved index entries.
The objectives call out malformed resolver output, but nothing exercises
applyResolutionPatchrejection or the "leaves unresolved index entries" branch invalidateResolutionPatch. Both are cheap to add with the existing fixture.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/pr-merge-conflict-fixer.test.ts` around lines 189 - 202, Add tests using the existing conflict fixture to cover malformed resolver output rejected by applyResolutionPatch and validateResolutionPatch rejecting patches that leave unresolved index entries. Add focused cases alongside the existing non-conflict-path test, asserting each path throws the expected validation error while preserving current fixture setup.tools/pr-merge-conflict-fixer/merge.mts (1)
33-56: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winTwo copies of the same Git exec helper, both using the default 1 MiB
maxBuffer.cat-file bloband-zpath listings can exceed that limit and throwENOBUFS, aborting resolution or publication.
tools/pr-merge-conflict-fixer/merge.mts#L33-L56: add an explicitmaxBuffertogitText/gitBufferand exportgitBuffer.tools/pr-merge-conflict-fixer/publish.mts#L120-L125: delete the localgitBufferand import the shared one frommerge.mts.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tools/pr-merge-conflict-fixer/merge.mts` around lines 33 - 56, The Git helpers use the default buffer limit and are duplicated across modules. In tools/pr-merge-conflict-fixer/merge.mts:33-56, add an explicit sufficiently large maxBuffer to gitText and gitBuffer, and export gitBuffer; in tools/pr-merge-conflict-fixer/publish.mts:120-125, remove the local gitBuffer and import the shared helper from merge.mts.tools/pr-merge-conflict-fixer/discover.mts (2)
132-150: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winOne unfetchable PR head aborts the whole scan.
prepareMergethrows (viaensureCommit/clone failures) when a head SHA was force-pushed or deleted between listing and analysis. That exception propagates out ofcheckConflictand kills discovery for every remaining PR. Prefer logging and skipping the individual PR.♻️ Skip the failing PR instead of aborting discovery
try { const merge = prepareMerge( sourceRepository, mergeRepository, pullRequest.head.sha, baseSha, ); return merge?.conflictPaths ?? null; + } catch (error) { + console.warn( + `Skipping PR #${pullRequest.number}: ${error instanceof Error ? error.message : String(error)}`, + ); + return null; } finally { rmSync(temporaryDirectory, { force: true, recursive: true }); }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tools/pr-merge-conflict-fixer/discover.mts` around lines 132 - 150, Update the checkConflict callback passed to selectConflictingPullRequests so prepareMerge failures for an individual pull request are caught, logged, and skipped by returning null instead of propagating the exception. Preserve the existing conflict-path result and temporary-directory cleanup, using the available pull request context in the log.
103-122: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winBound the pagination loop and add a request timeout.
The loop has no upper page bound and
fetchhas no timeout, so a stalled or misbehaving API response can hang or spin the scan job indefinitely.♻️ Proposed bound + timeout
- for (let page = 1; ; page += 1) { + const maxPages = 50; + for (let page = 1; page <= maxPages; page += 1) { const response = await request( `https://api.github.com/repos/${repository}/pulls?state=open&base=main&per_page=100&page=${page}`, { headers: { Accept: "application/vnd.github+json", Authorization: `Bearer ${token}`, "X-GitHub-Api-Version": "2022-11-28", }, + signal: AbortSignal.timeout(30_000), }, ); if (!response.ok) { throw new ConflictFixerError( `GitHub pull request listing failed with HTTP ${response.status}`, ); } const pageItems = (await response.json()) as PullRequest[]; pullRequests.push(...pageItems); if (pageItems.length < 100) return pullRequests; } + throw new ConflictFixerError("GitHub pull request listing exceeded the page limit"); }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tools/pr-merge-conflict-fixer/discover.mts` around lines 103 - 122, Bound the pagination loop in the pull-request discovery flow to a finite maximum page count, and add an abort-based timeout to the request in the existing request call. Preserve the current response validation and page accumulation behavior, while ensuring stalled requests and non-terminating pagination exit through the established error handling.test/pr-merge-conflict-fixer-workflow-boundary.test.ts (1)
19-41: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winPipeline reports increased branching in this file (3
ifstatements, up from 0).The Codebase Growth Guardrails check flagged this file. The
record/checkoutguard clauses could share one throwing helper to cut the branch count:♻️ Proposed consolidation
+function required<T>(value: T | undefined, message: string): T { + if (!value) throw new Error(message); + return value; +} + function namedStep(job: Record<string, unknown>, name: string): Record<string, unknown> { - const step = steps(job).find((candidate) => candidate.name === name); - if (!step) throw new Error(`Missing workflow step: ${name}`); - return step; + return required( + steps(job).find((candidate) => candidate.name === name), + `Missing workflow step: ${name}`, + ); } function checkout(job: Record<string, unknown>): Record<string, unknown> { - const step = steps(job).find((candidate) => - String(candidate.uses ?? "").startsWith("actions/checkout@"), - ); - if (!step) throw new Error("Missing checkout step"); - return step; + return required( + steps(job).find((candidate) => String(candidate.uses ?? "").startsWith("actions/checkout@")), + "Missing checkout step", + ); }Verify against the repo's guardrail script whether this satisfies the threshold, or whether test helpers are meant to be exempted.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/pr-merge-conflict-fixer-workflow-boundary.test.ts` around lines 19 - 41, Reduce branching in the test helpers by consolidating the throwing guard logic used by record/checkout, while preserving their current fallback and error behavior. Inspect the repository’s Codebase Growth Guardrails script to confirm the required threshold and whether test helpers are exempt; only adjust these helpers if needed to satisfy the guardrail.Source: Pipeline failures
.github/workflows/pr-merge-conflict-fixer.yaml (1)
15-48: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winConsider adding
timeout-minutestoscanandpublish.Only
resolvesets a job timeout (Line 48).scanandpublishcall the GitHub API (viadiscover.mts/publish.mts) and could hang up to the default 360-minute job limit if a network call stalls, tying up a runner unnecessarily.Also applies to: 187-199
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/pr-merge-conflict-fixer.yaml around lines 15 - 48, Set explicit timeout-minutes values on the scan and publish jobs, matching the bounded execution policy already used by resolve. Add the timeouts directly to the job definitions that run discover.mts and publish.mts, using an appropriate limit that prevents stalled GitHub API calls from consuming the default runner duration.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/pr-merge-conflict-fixer.yaml:
- Around line 54-61: Remove runner.temp expressions from the job-level env
blocks in the resolve and publish jobs. In the relevant job steps, write
ARTIFACT_DIR, RESOLUTION_WORKDIR, and RESOLVER_CONFIG_DIR to $GITHUB_ENV using
the RUNNER_TEMP environment variable, while preserving the existing resolved
directory values and publish job behavior.
In `@test/pr-merge-conflict-fixer.test.ts`:
- Around line 254-283: Replace the conditional request routing inside the mock
request function with a route map keyed by the matching API paths, preserving
each endpoint’s existing response behavior and dynamic values such as
entry.pr_number, entry.base_sha, finalTree, and commitSha. Keep the Git blob SHA
calculation unchanged, including createHash("sha1"), and retain the
unexpected-request error for unmatched routes.
- Around line 94-105: In the merge test around prepareMerge, assert that merge
is non-null before accessing conflictTree, then pass the narrowed
merge.conflictTree directly to git diff instead of using the empty-string
fallback. Remove or avoid conditionals that could let the test pass without
exercising the intended conflict-resolution claim.
---
Nitpick comments:
In @.github/workflows/pr-merge-conflict-fixer.yaml:
- Around line 15-48: Set explicit timeout-minutes values on the scan and publish
jobs, matching the bounded execution policy already used by resolve. Add the
timeouts directly to the job definitions that run discover.mts and publish.mts,
using an appropriate limit that prevents stalled GitHub API calls from consuming
the default runner duration.
In `@test/pr-merge-conflict-fixer-workflow-boundary.test.ts`:
- Around line 19-41: Reduce branching in the test helpers by consolidating the
throwing guard logic used by record/checkout, while preserving their current
fallback and error behavior. Inspect the repository’s Codebase Growth Guardrails
script to confirm the required threshold and whether test helpers are exempt;
only adjust these helpers if needed to satisfy the guardrail.
In `@test/pr-merge-conflict-fixer.test.ts`:
- Around line 35-58: Update createConflictFixture and its git helper setup to
isolate the temporary repository from ambient global and system Git
configuration, disabling inherited settings such as merge.conflictStyle,
core.autocrlf, hooks, and init templates while preserving the existing
repository-specific configuration and fixture behavior.
- Around line 189-202: Add tests using the existing conflict fixture to cover
malformed resolver output rejected by applyResolutionPatch and
validateResolutionPatch rejecting patches that leave unresolved index entries.
Add focused cases alongside the existing non-conflict-path test, asserting each
path throws the expected validation error while preserving current fixture
setup.
In `@tools/pr-merge-conflict-fixer/discover.mts`:
- Around line 132-150: Update the checkConflict callback passed to
selectConflictingPullRequests so prepareMerge failures for an individual pull
request are caught, logged, and skipped by returning null instead of propagating
the exception. Preserve the existing conflict-path result and
temporary-directory cleanup, using the available pull request context in the
log.
- Around line 103-122: Bound the pagination loop in the pull-request discovery
flow to a finite maximum page count, and add an abort-based timeout to the
request in the existing request call. Preserve the current response validation
and page accumulation behavior, while ensuring stalled requests and
non-terminating pagination exit through the established error handling.
In `@tools/pr-merge-conflict-fixer/merge.mts`:
- Around line 33-56: The Git helpers use the default buffer limit and are
duplicated across modules. In tools/pr-merge-conflict-fixer/merge.mts:33-56, add
an explicit sufficiently large maxBuffer to gitText and gitBuffer, and export
gitBuffer; in tools/pr-merge-conflict-fixer/publish.mts:120-125, remove the
local gitBuffer and import the shared helper from merge.mts.
In `@tools/pr-merge-conflict-fixer/publish.mts`:
- Around line 359-361: Replace the discarded readFileSync call near
artifactDirectory and patchPath with statSync to check the patch exists without
loading its contents. Validate the resulting file size and reject implausibly
large sandbox-produced patches before continuing, and update the node:fs import
accordingly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: bc19778c-f1f3-4052-b550-883777be0670
📒 Files selected for processing (9)
.github/workflows/pr-merge-conflict-fixer.yamltest/helpers/vitest-watch-triggers.tstest/pr-merge-conflict-fixer-workflow-boundary.test.tstest/pr-merge-conflict-fixer.test.tstools/pr-merge-conflict-fixer/discover.mtstools/pr-merge-conflict-fixer/merge.mtstools/pr-merge-conflict-fixer/policy.yamltools/pr-merge-conflict-fixer/publish.mtstools/pr-merge-conflict-fixer/resolve.mts
There was a problem hiding this comment.
🧹 Nitpick comments (1)
test/pr-merge-conflict-fixer.test.ts (1)
50-55: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueDuplicate
required()helper across test files.The same
required<T>implementation appears verbatim intest/pr-merge-conflict-fixer-workflow-boundary.test.ts. Consider extracting it into a shared test helper (e.g. undertest/helpers/) to avoid the two copies drifting apart.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/pr-merge-conflict-fixer.test.ts` around lines 50 - 55, Extract the duplicated required<T> helper from pr-merge-conflict-fixer.test.ts and pr-merge-conflict-fixer-workflow-boundary.test.ts into a shared test helper under test/helpers, then import and reuse that single implementation in both files while preserving its existing assertions and return behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@test/pr-merge-conflict-fixer.test.ts`:
- Around line 50-55: Extract the duplicated required<T> helper from
pr-merge-conflict-fixer.test.ts and
pr-merge-conflict-fixer-workflow-boundary.test.ts into a shared test helper
under test/helpers, then import and reuse that single implementation in both
files while preserving its existing assertions and return behavior.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 82818a64-a94b-47e4-8b72-8428529cfb5c
📒 Files selected for processing (5)
.github/workflows/pr-merge-conflict-fixer.yamltest/pr-merge-conflict-fixer-workflow-boundary.test.tstest/pr-merge-conflict-fixer.test.tstools/pr-merge-conflict-fixer/policy.yamltools/pr-merge-conflict-fixer/publish.mts
🚧 Files skipped from review as they are similar to previous changes (3)
- .github/workflows/pr-merge-conflict-fixer.yaml
- tools/pr-merge-conflict-fixer/publish.mts
- test/pr-merge-conflict-fixer-workflow-boundary.test.ts
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@tools/pr-merge-conflict-fixer/resolve.mts`:
- Around line 191-217: Update defaultTools.run to pass a bounded timeout to
execFileSync for each command invocation, ensuring a hung gateway readiness
check fails and returns control to configureOpenShellInference’s retry loop. Use
the existing readiness-attempt timing or another appropriate per-call limit that
preserves the 30-attempt, 1-second polling behavior.
- Around line 108-135: Update gatewayConfiguration and
configureOpenShellInference to validate that bindAddress, derived from
OPENSHELL_GATEWAY_ENDPOINT, resolves to a loopback address before generating
configuration with disable_tls and allow_unauthenticated_users enabled. Reject
non-loopback hosts, including malformed or externally reachable addresses, while
preserving valid 127.0.0.1 and ::1 behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 2c19f40a-da75-4d37-b882-c5db043443b8
📒 Files selected for processing (4)
.github/workflows/pr-merge-conflict-fixer.yamltest/pr-merge-conflict-fixer-workflow-boundary.test.tstest/pr-merge-conflict-fixer.test.tstools/pr-merge-conflict-fixer/resolve.mts
🚧 Files skipped from review as they are similar to previous changes (1)
- .github/workflows/pr-merge-conflict-fixer.yaml
<!-- markdownlint-disable MD041 --> ## Summary Add the canonical `docs/changelog/2026-07-25.mdx` release entry with the exact `## v0.0.96` heading. The entry reconciles all 90 first-parent commits since v0.0.95 with all 92 merged PRs in the live `v0.0.96` label ledger and groups the user-visible changes by operator journey. ## Changes - Add the parser-safe dated MDX changelog entry for v0.0.96 with root-absolute links to the focused user guides. - Source summary: - [#7194](#7194) -> `docs/changelog/2026-07-25.mdx`: Document persistent baseline network policy exclusions and their inspection, rebuild, and snapshot behavior. - [#7188](#7188), [#7427](#7427), and [#7546](#7546) -> `docs/changelog/2026-07-25.mdx`: Document DNS-backed HTTPS inference routing, keyless loopback endpoints, and provider-marker isolation. - [#7238](#7238) -> `docs/changelog/2026-07-25.mdx`: Document blueprint sandbox and provider identifier validation before state writes or OpenShell calls, with bounded terminal-safe rejection previews. - [#7319](#7319), [#7274](#7274), [#7528](#7528), [#7353](#7353), and [#7560](#7560) -> `docs/changelog/2026-07-25.mdx`: Document the managed default gateway service, onboarding readiness, and container-runtime identity safeguards. - [#7349](#7349), [#7498](#7498), [#7406](#7406), [#7196](#7196), [#7559](#7559), [#7421](#7421), [#7510](#7510), [#7295](#7295), and [#7565](#7565) -> `docs/changelog/2026-07-25.mdx`: Document gateway-scoped status, lifecycle diagnostics, managed MCP recovery, delete-edge safeguards, and fail-closed CLI prompt and command output. - [#7591](#7591) -> `docs/changelog/2026-07-25.mdx`: Document opt-in authenticated MCP tool-name discovery, its bounded and names-only contract, probe interaction, and rebuild requirement. - [#7305](#7305), [#7480](#7480), [#7471](#7471), [#7365](#7365), and [#7541](#7541) -> `docs/changelog/2026-07-25.mdx`: Document installer version checks, version-tag reporting, license guidance, WSL Ollama selection, and DGX Station vLLM detection. - [#7482](#7482), [#7466](#7466), [#7208](#7208), [#7434](#7434), and [#7586](#7586) -> `docs/changelog/2026-07-25.mdx`: Document Ollama resource details, reasoning precedence, Hermes onboarding behavior, and preserved managed Hermes BuildKit failures. - [#6830](#6830), [#7492](#7492), [#7563](#7563), and [#7582](#7582) -> `docs/changelog/2026-07-25.mdx`: Document the authoritative OpenClaw production lock, fixed managed-image dependencies, immutable Hermes base adoption, and Hermes image-size reduction. - [#7505](#7505), [#7530](#7530), [#7547](#7547), [#7508](#7508), [#7548](#7548), [#7549](#7549), [#7537](#7537), [#7534](#7534), [#7515](#7515), [#7511](#7511), [#7551](#7551), [#7562](#7562), [#7575](#7575), [#7496](#7496), [#7594](#7594), [#7595](#7595), and [#7599](#7599) -> `docs/changelog/2026-07-25.mdx`: Summarize release validation, transient and bounded dispatch reconciliation, exact pre-tag qualification, identity revalidation, npm-audit retry, sharding, image reuse, timeout, telemetry, and workflow-hardening changes. - Reconciled without separate changelog prose: - [#7539](#7539), [#7526](#7526), [#7507](#7507), [#7506](#7506), [#7519](#7519), [#7516](#7516), [#7396](#7396), [#7254](#7254), [#7583](#7583), [#7596](#7596), and [#7598](#7598): Test-harness or fixture-only changes. - [#7403](#7403), [#7161](#7161), [#6877](#6877), [#7531](#7531), [#7525](#7525), [#7522](#7522), [#7536](#7536), [#7552](#7552), [#7566](#7566), [#7553](#7553), [#7561](#7561), [#7577](#7577), [#7569](#7569), [#7585](#7585), [#7584](#7584), [#7592](#7592), [#7580](#7580), [#7571](#7571), [#7517](#7517), [#7589](#7589), [#7402](#7402), [#7558](#7558), [#7544](#7544), and [#7601](#7601): Dependency, internal recovery, validation, contributor-workflow, E2E optimization, telemetry, or CI trust changes with no separate user-facing release claim. - [#7556](#7556), [#7573](#7573), [#7576](#7576), and [#7578](#7578): Experimental repository-maintainer conflict automation with no canonical user documentation surface. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [x] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates - [ ] Tests added or updated for changed behavior - [x] Existing tests cover changed behavior — justification: `test/changelog-docs.test.ts` validates dated changelog structure, version headings, and published links. - [ ] Tests not applicable — justification: - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [ ] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Documentation Writer Review - [x] Documentation writer subagent reviewed the completed changes - Result: `docs-updated` - Evidence: Reviewed `docs/changelog/2026-07-25.mdx` at exact head `0f5dedb47` against 90 first-parent release commits and 92 merged PRs labeled `v0.0.96`. Verified parser-safe MDX SPDX, the exact version heading, literal CLI names, writing style, skip terms, all 20 root-absolute published links, and the accepted #7591 opt-in authenticated discovery bounds. #7544, #7599, and #7601 remain internal or CI-only release-ledger entries. Changelog tests passed 6/6, the docs build passed with 0 errors and two pre-existing Fern warnings, and `npm run check:diff` plus the final diff check passed. - Agent: Codex Desktop documentation-writer subagent <!-- docs-review-head-sha: 0f5dedb --> <!-- docs-review-agents-blob-sha: be20a09 --> ## DGX Station Hardware Evidence - [ ] Tested on DGX Station - Tested commit: - Station profile/scenario: - Result: - Supporting evidence: ## Verification - [x] PR description includes a `Signed-off-by:` line and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or `npm run check:diff` passed when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — `npx vitest run test/changelog-docs.test.ts`: 6/6 passed. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: Not applicable to this prose-only changelog entry. - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) — the build passed with 0 errors and 2 existing Fern warnings; the published-route check passed. - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [ ] New doc pages include SPDX header and frontmatter (new pages only) — native changelog files use the required parser-safe MDX SPDX comment and no frontmatter. --- Signed-off-by: Carlos Villela <cvillela@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Persistent network policy exclusions with consistent restore/exclusion reporting across rebuilds/snapshots. * Opt-in MCP tool discovery via `mcp status --tools` with bounded, redacted authenticated traffic. * Improved HTTPS inference switching for custom endpoints and refreshed onboarding/model menu details. * Refined OpenShell gateway defaults for port `8080`, including more reliable readiness checks. * **Bug Fixes** * Prevent incorrect provider/model restoration after compatible-provider update failures. * Preserve managed MCP state after exec loss and tighten gateway/doctor status scoping. * **Tests** * Stronger, fail-closed release validation with hardened evidence/artifact handoff and bounded timeouts/retries. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com> Co-authored-by: Prekshi Vyas <prekshiv@nvidia.com>
Summary
Adds experimental maintainer automation that resolves every conflicted same-repository PR after a push to
main. Pi resolves the disposable merge in a credential-free OpenShell sandbox, while trusted code validates and atomically publishes only the recorded conflict paths.Related Issue
Fixes #7542
Changes
mainand skip forks before Git merge analysis.mainSHA.azure/openai/gpt-5.6-terrathrough OpenShell inference, without GitHub or upstream model credentials in the sandbox./procor/tmp, no network allowlist, and only the required runtime directories plus container-local/devand/sandbox.Type of Change
Quality Gates
Documentation Writer Review
no-docs-neededc2117daa622481409280f47dfd9b015002a9ceaftightens the internal resolver gateway boundary and readiness subprocess behavior. It adds no user-facing command, supported configuration, integration, docs route, or canonical operating procedure. Issue ci: resolve PR merge conflicts with a sandboxed Pi agent #7542 remains the product record; 16 focused tests, CLI type-checking, source-shape, test-size, and normal hooks passed.DGX Station Hardware Evidence
Verification
Signed-off-by:line and every commit appears as Verified in GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run check:diffpassed when hooks were skipped or unavailablenpx vitest run --project integration test/pr-merge-conflict-fixer.test.ts test/pr-merge-conflict-fixer-workflow-boundary.test.ts— 2 files and 16 tests passed.npm testfor broad runtime/test-harness changes;npm run checkfor repo-wide validation/coverage changes — command/result:npm run docsbuilds without warnings (doc changes only)Signed-off-by: Carlos Villela cvillela@nvidia.com
Summary by CodeRabbit
main, resolves them in a sandbox, and publishes a verified merge/resolve commit when conflicts are found.